package br.com.sap.controle;

import java.util.ArrayList;
import java.util.List;

import br.com.sap.modelo.AnuncioObjPerdido;
import br.com.sap.modelo.Categoria;
import br.com.sap.modelo.Modelo;
import br.com.sap.modelo.Tipo;
import br.com.sap.modelo.TipoMarca;
import br.com.sap.modelo.enums.EnumSituacao;
import br.com.sap.persistencia.servico.AnuncioObjPerdidoServico;
import br.com.sap.persistencia.servico.CategoriaServico;
import br.com.sap.persistencia.servico.MarcaServico;
import br.com.sap.persistencia.servico.ModeloServico;
import br.com.sap.persistencia.servico.ServicoGenerico;
import br.com.sap.persistencia.servico.TipoServico;
import br.com.sap.persistencia.servico.TipoMarcaServico;
import br.com.sap.persistencia.servico.UsuarioServico;
import br.com.sap.utils.erros.Erro;
import br.com.sap.utils.erros.TipoErro;
import br.com.sap.utils.erros.TipoMensagemErro;


public class AnuncioObjPerdidoControle extends ControleGenerico<AnuncioObjPerdido> {

	private AnuncioObjPerdidoServico anuncioObjPerdidoServico = new AnuncioObjPerdidoServico();
	private UsuarioServico usuarioServico = new UsuarioServico();
	private CategoriaServico categoriaServico = new CategoriaServico();
	private TipoServico tipoServico = new TipoServico();
	private MarcaServico marcaServico = new MarcaServico();
	private TipoMarcaServico tipomarcaServico = new TipoMarcaServico();
	private ModeloServico modeloServico = new ModeloServico();	
	private ControleGenerico<AnuncioObjPerdido> controleGenerico;
	
	public MarcaServico getMarcaServico() {
		return marcaServico;
	}

	public void setMarcaServico(MarcaServico marcaServico) {
		this.marcaServico = marcaServico;
	}
	

	public ControleGenerico<AnuncioObjPerdido> getControleGenerico() {
		return controleGenerico;
	}

	public void setControleGenerico(ControleGenerico<AnuncioObjPerdido> controleGenerico) {
		this.controleGenerico = controleGenerico;
	}

	public AnuncioObjPerdidoServico getAnuncioObjPerdidoServico() {
		return anuncioObjPerdidoServico;
	}
	
	@Override
	public ServicoGenerico<AnuncioObjPerdido> getServico() {
		// TODO Auto-generated method stub
		return this.anuncioObjPerdidoServico;
	}
	
	public List<Categoria> getListarCategoria() {
		return categoriaServico.getLista();
	}

	public List<Tipo> getListarTipo(Categoria categoria) {
		tipoServico.camposProcura.limpar();
		if (categoria != null) {
			tipoServico.camposProcura.add("categoria",
					categoria.getId().toString(), true);
		} else {
			System.out.println("CATEGORIA NULL");
			return null;
		}

		return tipoServico.procura();
	}
	
	public List<TipoMarca> getListarTipoMarcas(Tipo tipo) {
		tipomarcaServico.camposProcura.limpar();
		if (tipo != null) {
			tipomarcaServico.camposProcura.add("tipo",
					tipo.getId().toString(), true);
		} else {
			System.out.println("Tipo NULL");
			return null;
		}

		return tipomarcaServico.procura();
	}


	
	
	public List<Modelo> getListarModelos(TipoMarca tipomarca) {
		modeloServico.camposProcura.limpar();
		if (tipomarca != null) {
			modeloServico.camposProcura.add("tipomarca",
					tipomarca.getId().toString(), true);
		} else {
			System.out.println("Tipo NULL");
			return null;
		}

		return modeloServico.procura();
	}
	
	public List<AnuncioObjPerdido> getListarAnuncios(String chaveBusca, String usuarioSessao) {
		anuncioObjPerdidoServico.camposProcura.limpar();
		if (chaveBusca != null) {
			this.getServico().camposProcura.add(("descricao"), chaveBusca);
			this.getServico().camposProcura.add(("situacao"), "1", true);
			this.getServico().camposProcura.add(("usuario"), usuarioSessao, true);
			this.getServico().camposProcura.setCondicional("and");
		} else {
			System.out.println("Anuncio NULL");
			return null;
		}

		return anuncioObjPerdidoServico.procura();
	}

	public TipoMarcaServico getTipomarcaServico() {
		return tipomarcaServico;
	}

	public void setTipomarcaServico(TipoMarcaServico tipomarcaServico) {
		this.tipomarcaServico = tipomarcaServico;
	}

	public UsuarioServico getUsuarioServico() {
		return usuarioServico;
	}

	public void setUsuarioServico(UsuarioServico usuarioServico) {
		this.usuarioServico = usuarioServico;
	}
	
	
	public int registrarAnuncioObjPerdido(AnuncioObjPerdido anuncioObjPerdido) {
		int retorno;
		retorno = 0;
		if(antesProcurar(anuncioObjPerdido)){			
		if(anuncioObjPerdido.equals(null)){
			if(verificaconsistencia(anuncioObjPerdido)){	
				if(persiste(anuncioObjPerdido)){
						retorno = 1;
						}
				
			}else{
				super.erros.add(new Erro(TipoErro.VIOLACAO_CONSISTENCIA, "VIOLACAO_CONSISTENCIA", TipoMensagemErro.ERROR));
				retorno = 3;
			}
		}else{
			if(verificaduplicidade(anuncioObjPerdido)){
				if(persiste(anuncioObjPerdido)){
					retorno = 2;
					}
					}else{
						retorno = 4;
				super.erros.add(new Erro(TipoErro.VIOLACAO_UNICIDADE, "VIOLACAO_UNICIDADE", TipoMensagemErro.ERROR));
			}
		}
		
		}else{
			retorno = 5;
		}
		return retorno;
	}
	
	public boolean removerAnuncioObjPerdido(AnuncioObjPerdido anuncioObjPerdido) {
	anuncioObjPerdido.setStatus(0);
	anuncioObjPerdido.setSituacao(EnumSituacao.EXCLUIDO);
	int receberetorno;
	boolean retorno;
	receberetorno = registrarAnuncioObjPerdido(anuncioObjPerdido);
	retorno = false;
	if(receberetorno == 1){
				retorno = true;
				}else{
				super.erros.add(new Erro(TipoErro.EMAILERROR,"EMAILERROR", TipoMensagemErro.ERROR));
				retorno = false;
			}
	return retorno;
	}
	
	public boolean verificaconsistencia(AnuncioObjPerdido anuncioObjPerdido){
		//SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
		
		this.anuncioObjPerdidoServico.camposProcura.add(("id"), anuncioObjPerdido.getId().toString(), true);
		this.anuncioObjPerdidoServico.camposProcura.add(("categoria"), anuncioObjPerdido.getCategoria().getId().toString(), true);
		this.anuncioObjPerdidoServico.camposProcura.add(("tipo"), anuncioObjPerdido.getTipo().getId().toString(), true);
		this.anuncioObjPerdidoServico.camposProcura.add(("tipoMarca"), anuncioObjPerdido.getTipoMarca().getId().toString(), true);
		this.anuncioObjPerdidoServico.camposProcura.add(("modelo"), anuncioObjPerdido.getModelo().getId().toString(), true);
		//this.anuncioObjPerdidoServico.camposProcura.add(("dataqachou"), anuncioObjPerdido.getDataqachou().toString(), true);
		this.anuncioObjPerdidoServico.camposProcura.setCondicional("and");
		ArrayList<AnuncioObjPerdido> anuncioObjPerdidos = procura();
				if (anuncioObjPerdidos.size() > 0) {
					return false;
				}else
					return true;
		}

	
	public boolean verificaduplicidade(AnuncioObjPerdido anuncioObjPerdido){		
		this.anuncioObjPerdidoServico.camposProcura.add(("categoria"), anuncioObjPerdido.getCategoria().getId().toString(), true);
		this.anuncioObjPerdidoServico.camposProcura.add(("tipo"), anuncioObjPerdido.getTipo().getId().toString(), true);
		this.anuncioObjPerdidoServico.camposProcura.add(("tipoMarca"), anuncioObjPerdido.getTipoMarca().getId().toString(), true);
		this.anuncioObjPerdidoServico.camposProcura.add(("modelo"), anuncioObjPerdido.getModelo().getId().toString(), true);
		//System.out.println(anuncioObjPerdido.getDataqachou());
		//this.anuncioObjPerdidoServico.camposProcura.add(("dataqachou"), anuncioObjPerdido.getDataqachou(), true);		
		this.anuncioObjPerdidoServico.camposProcura.setCondicional("and");
		ArrayList<AnuncioObjPerdido> anuncioObjPerdidos = procura();
				if (anuncioObjPerdidos.size() == 0) {
					return  true;
				}else
							
					return false;
		}
	
	

}

